package ar.uade.distribuidas.tpo.dba.dominio;

import java.util.LinkedList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;

//import org.joda.time.LocalDate;

import ar.uade.distribuidas.tpo.base.dominiodto.ItemPedidoDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.OrdenDePedidoDTO;


@Entity
@Table(name="ordenesDePedido")
public class OrdenDePedido {

	@Id
	private Long numero;
	private String fecha;
	@ManyToOne
	private Cliente cliente;
	
	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn (name = "orden_id")
	private List<ItemPedido> itemsPedido;
	
	
	
	@OneToOne (cascade = CascadeType.ALL)
	@JoinColumn(name="idCondicionVenta")
	private CondicionDeVenta condicionVenta;
	
	
	public OrdenDePedido(Long numero, String fecha, Cliente cliente,
			List<ItemPedido> itemsPedido, CondicionDeVenta condicionVenta) {
		super();
		this.numero = numero;
		this.fecha = fecha;
		this.cliente = cliente;
		this.itemsPedido = itemsPedido;
		this.condicionVenta = condicionVenta;
	}
	
	



	public OrdenDePedido() {
		this.itemsPedido = new LinkedList<ItemPedido>();
		this.numero = System.currentTimeMillis();
	}
	
	




	public List<ItemPedido> getItemsPedido() {
		return itemsPedido;
	}



	public void setItemsPedido(List<ItemPedido> itemsPedido) {
		this.itemsPedido = itemsPedido;
	}



	public Long getNumero() {
		return numero;
	}

	public void setNumero(Long numero) {
		this.numero = numero;
	}

	public String getFecha() {
		return fecha;
	}

	public void setFecha(String fecha) {
		this.fecha = fecha;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	

	public CondicionDeVenta getCondicionVenta() {
		return condicionVenta;
	}

	public void setCondicionVenta(CondicionDeVenta condicionVenta) {
		this.condicionVenta = condicionVenta;
	}

	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((cliente == null) ? 0 : cliente.hashCode());
		result = prime * result
				+ ((condicionVenta == null) ? 0 : condicionVenta.hashCode());
		result = prime * result + ((fecha == null) ? 0 : fecha.hashCode());
		result = prime * result
				+ ((itemsPedido == null) ? 0 : itemsPedido.hashCode());
		result = prime * result + ((numero == null) ? 0 : numero.hashCode());
		return result;
	}





	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		OrdenDePedido other = (OrdenDePedido) obj;
		if (cliente == null) {
			if (other.cliente != null)
				return false;
		} else if (!cliente.equals(other.cliente))
			return false;
		if (condicionVenta == null) {
			if (other.condicionVenta != null)
				return false;
		} else if (!condicionVenta.equals(other.condicionVenta))
			return false;
		if (fecha == null) {
			if (other.fecha != null)
				return false;
		} else if (!fecha.equals(other.fecha))
			return false;
		if (itemsPedido == null) {
			if (other.itemsPedido != null)
				return false;
		} else if (!itemsPedido.equals(other.itemsPedido))
			return false;
		if (numero == null) {
			if (other.numero != null)
				return false;
		} else if (!numero.equals(other.numero))
			return false;
		return true;
	}





	@Override
	public String toString() {
		return "OrdenDePedido [numero=" + numero + ", fecha=" + fecha + ", cliente=" + cliente + ", itemsPedido="
				+ itemsPedido + ", condicionVenta=" + condicionVenta + "]";
	}

	public OrdenDePedidoDTO toDTO(){
		OrdenDePedidoDTO dto = new OrdenDePedidoDTO();
		dto.setCliente(cliente.toDTO());
		if(condicionVenta!=null)
			dto.setCondicionVenta(condicionVenta.toDTO());
		dto.setFecha(fecha);
		dto.setNumero(numero);
		dto.setItemsPedido(listPedidoToDTO(itemsPedido));
		return dto;
	}
	
	private  List<ItemPedidoDTO> listPedidoToDTO(List<ItemPedido> lista){
		List<ItemPedidoDTO> dtoList = new LinkedList<ItemPedidoDTO>();
		
		for(ItemPedido item : lista){
			dtoList.add(item.toDTO());
		}
		
		return dtoList;
		
	}
	
	public ItemPedido getItemPedidoWithRodamiento(Long idRod){
		int i =0;
		while(i<itemsPedido.size()){
			if(itemsPedido.get(i).getRodamientoId() == idRod)
				return itemsPedido.get(i);
			
			i++;
		}
		
		return null;
	}
	
	
	
	private static  List<ItemPedido> itemsPedidoFromDto(List<ItemPedidoDTO> listaDtos){
		List <ItemPedido> listaItems = new LinkedList<ItemPedido>();
		
		for(ItemPedidoDTO itemP : listaDtos){
			
			listaItems.add(ItemPedido.fromDTO(itemP));
		}
		
		return listaItems;
	}
	
	
	
	public static OrdenDePedido fromDTO(OrdenDePedidoDTO dto){
		OrdenDePedido o = new OrdenDePedido();
		
		o.setCliente(Cliente.fromDTO(dto.getCliente()));
		o.setCondicionVenta(CondicionDeVenta.fromDTO(dto.getCondicionVenta()));
		o.setFecha(dto.getFecha());
				
		o.setItemsPedido(itemsPedidoFromDto(dto.getItemsPedido()));
		
		o.setNumero(dto.getNumero());
		
		return o;
	}
}
